package algorithm_primary.studyMySelf.class01;

/**
 * @author 衡孟浩
 * @date 2022/9/28 22:46
 */
public class Code07_JinZhi {

    /**
     *
     * @param num
     *
     * & 是怎么算的？
     *       比如：int类型的num = 3
     *       那么他的二进制就是  0000 0000 0000 0000 0000 0000 0000 0011
     *       那么1的二进制是    0000 0000 0000 0000 0000 0000 0000 0001
     *       这时候如果1<<31 那么也就是说他要左移31位
     *                       1000 0000 0000 0000 0000 0000 0000 000
     *       而 & 符号代表就是  1：0 = 0， 0：0 = 0， 1：1 = 1
     *       所以当i为31的时候  1<<i  就是1000 0000 0000 0000 0000 0000 0000 000
     *       num & (1 << i)：
     *                       1000 0000 0000 0000 0000 0000 0000 000
     *                       0000 0000 0000 0000 0000 0000 0000 0011
     *                       那么这时候他肯定就是
     *                       0000 0000 0000 0000 0000 0000 0000 0000
     *       同理，& 也可以快速得到奇偶，比如一个奇数，那么他的最后一个二进制肯定为1
     *                所以这时候就可以进行 num & 1，如果等于1那么肯定就是奇数
     *                   dev测试
     */

    public static void jinzhi_(int num) {
        for (int i = 31; i >= 0; i--) {
            System.out.print((num & (1 << i)) == 0 ? 0 : 1);
        }
    }

    public static void main(String[] args) {
        //jinzhi_(-2);
//        long start1 = System.currentTimeMillis();
////        int a = 2 & 1;
////        long end1 = System.currentTimeMillis();
////        System.out.println(end1 - start1);
////
////        long start2 = System.currentTimeMillis();
////        int b = 2%2;
////        long end2 = System.currentTimeMillis();
////        System.out.println(end2 - start2);

        /**
         * 左移也就是左边第一个是1的开始左移，比如 00000000000000000000000000101100
         * 如果全部移动完那么就是               00000000000000000000000000000000
         * 这时候如果再 在原有的位移+1  就会出现  00000000000000000000000000101100
         */
        jinzhi_(22);
        System.out.println();
        jinzhi_(22<<32);
        System.out.println();
        System.out.println(22<<32);


        int a =3 & 3;
        System.out.println("a = " + a);
    }
}
